#include <iostream>
#include <cstdio>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <unistd.h>
#define PATHNAME "."
const int proj_id = 066;
const int size = 4096;
int main()
{
    // 生成key
    key_t key = ftok(PATHNAME, proj_id);
    printf("key : %d\n", key);
    // 创建共享内存
    // int shmid = shmget(key, size, IPC_CREAT | IPC_EXCL);
    int shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | 0666);
    printf("shmid : %d\n", shmid);
    if (shmid < 0)
    {
        perror("shmget ");
        exit(1);
    }
    //连接共享内存
    void* start = shmat(shmid, nullptr, 0);
    if((long long) start < 0)
    {
        perror("shmat");
        exit(1);
    }
    //连接成功
    printf("Start Virtual Address : %p\n", start);
    //获取内核数据结构
    struct shmid_ds ds;
    shmctl(shmid, IPC_STAT, &ds);
    printf("ds->_key : %d\n",ds.shm_perm.__key);
    printf("ds->natch : %ld\n",ds.shm_nattch);
    //删除共享内存
    int n = shmctl(shmid, IPC_RMID, nullptr);
    if (n < 0)
    {
        perror("shmctl");
        exit(1);
    }
    std::cout << "rmshm success" << std::endl;
    return 0;
}

// int main()
// {
//     // 生成key
//     key_t key = ftok(PATHNAME, proj_id);
//     printf("key : %d\n", key);
//     // 创建共享内存
//     // int shmid = shmget(key, size, IPC_CREAT | IPC_EXCL);
//     int shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | 0666);
//     printf("shmid : %d\n", shmid);
//     if (shmid < 0)
//     {
//         perror("shmget ");
//         exit(1);
//     }
//     //连接共享内存
//     void* start = shmat(shmid, nullptr, 0);
//     if((long long) start < 0)
//     {
//         perror("shmat");
//         exit(1);
//     }
//     //连接成功
//     printf("Start Virtual Address : %p\n", start);
//     //sleep(3);
//     //去连接
//     int dt = shmdt(start);
//     if(dt < 0){
//         perror("shmdt");
//         exit(1);
//     }
//     //删除共享内存
//     int n = shmctl(shmid, IPC_RMID, nullptr);
//     if (n < 0)
//     {
//         perror("shmctl");
//         exit(1);
//     }
//     std::cout << "rmshm success" << std::endl;
//     return 0;
// }